查看原文
其他

你也许连删库跑路都不会

IT服务圈儿 2022-09-10

The following article is from 脚本之家 Author 朱钢


来源 l 脚本之家(ID:jb51net)


文 末 包 邮 送 书


作者 | 朱钢

出品 | 脚本之家(ID:jb51net)

这两年 IT 界隔三岔五的出现一次程序员删库的新闻,这种删库跑路的行为往往会给受害公司造成很大的损失,甚至会导致一个公司的破产。我们程序员看到这类新闻的时候很大一部分会把它当作一个闲聊的摊子,但是各位读者你是否想过这么一个问题:我知道怎么正确删库吗?看到这里估计有读者会感觉删库谁不会啊 Delete 以下呗。如果你这么想的话那就接着看这篇文章吧,在后面的内容中我将讲解数据库删除数据的方式以及原理。

在 MySQL 中有三种删除数据的方式,分别是 deletedrop 和 truncate。这三种方式用起来简单,但是背后的原理和注意事项估计大部分开发人员并不清楚,下面我就来讲解以下原理以及注意事项。

delete

Delete 是数据库 DML 操作语言,在删除数据的时候只会删除数据而不会删除数据所在表的表结构,并且在删除数据的时候会执行事务和触发 trigger。而且如果你所使用的数据库引擎是 InnoDB 的话 MySQL 会在执行删除数据操作的时候只把数据标注为已删除而不去真正的删除数据,因此在这种情况下如果你使用 Delete 删除数据的时候会发现表大小并没有改变。

但是当你的数据库引擎是 MyISAM 的情况下执行 delete from table  语句会真正的删除表中的数据并释放空间的,如果你想让 MyISAM 引擎也能实现 InnoDB 引擎假删除的效果的话,你需要在 Delete 语句后面加上 Where 条件即可,例如 delete from user where age<18 这段语句执行后符合条件的数据将会标注为删除,并且所占空间不释放。

这时肯定有杠精的小朋友会说:“我就想使用 InnoDB 引擎,我也想释放被删除数据所占用的空间。”这种想法 MySQL 为我们提供了解决方案,那就是 optimize table 语句,我们来看一下例子:我们用 Delete 语句删除表中所有的数据后我们来查看以下现在这张表所占的空间大小(如下图)

从上图中我们可以看到我们删除了 book 表中的所有数据,但是该表所占用的空间大小几乎没发生变化。这时我们执行 optimize table 语句后再次查看表的空间大小,我们发现表的大小变成了 0.02M,只剩下了表结构的大小了(如下图)

我们在用 Delete 语句删除数据的时候需要注意的是 delete 操作是一行一行的执行的,并且会将每行的删除日志记录在 redo 和 undo 表空间中以方便日后回滚和重做,这样就产生大量的日志进而占用大量的空间。因此当我们在进项大规模删除数据的时候不建议使用 Delete 语句。

Tip:这里有一个比较有意思的地方:虽说被删除数据所占用的空间没有被释放,但是当我们执行 Insert 操作的时候这部分未被释放的空间依然是可以被重用的。


truncate 和 drop

truncate 是数据库 DDL 语言,它和 delete 最大的区别是它不走事务数据也不放在 rollback segment 里,同时也不会触发 trigger, 因此执行 truncate 语句后会立即删除指定的数据且无法恢复,并释放数据所占用的空间(不管使用的数据库引擎是 InnoDB 还是 MyISAM )。truncate 语句一般用于快速清空表中数据并需要重置 auto_increment 值的情况。

关于重置 auto_increment 值需要有如下两点注意:

  • 在使用 InnoDB 引擎的情况下如果使用 truncate autoincrement会重置为 1 ,但是如果使用 delete 则 autoincrement 在重启 MySQL 之前仍然保持当前值,重启值后重置为 1 ;

  • 在使用 MyISAM 引擎的情况下如果使用 truncate autoincrement会重置为 1 ,但如果使用 delete 则 autoincrement 仍然保持当前值。

drop 同样是数据库 DDL 语言,它和 truncate 一样一旦执行将立即删除表和依赖、触发器、索引,但是会保留和该表相关的存储过程以及函数,并将状态改为 invalid 。

总结

上面讲这么多简单总结一下:如果把表比喻成一个包子的话,那么 delete 就是把馅从包子里拿出来放在别的盘子里,truncate 就是把馅从包子里拿出来吃掉,drop 就是直接把包子吃掉。

删库的技能学会了吗?

写的不错?赞赏一下

长按扫码赞赏我

本文作者:朱钢,笔名喵叔,.NET 高级开发人员,2019 年度博客之星 20 强,长期从事电子政务系统和AI客服系统的设计与开发,目前就职于国内某 BIM 大厂从事招投标软件的开发。

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。


👇👇👇留言的朋友均有机会获得书籍呦~


今日书单 | 包邮送


推荐理由: 《Python数据分析与大数据处理从入门到精通》主要讲解数据分析与大数据处理所需的技术、基础设施、核心概念、实施流程。

注意:本套装两本书籍哦~~



推荐理由: 217个实训案例+28集同步教学视频+调试通过的源代码+数据集,将算法与编程进行了完美融合。


推荐理由: 学R语言、练语法、取数据、预处理、可视化、交互图、重实战,一书在手,精通R语言数据分析与可视化。




活动规则:


我们将从精选留言中随机抽取 6名 伙伴赠书,中奖者可在上方书单中任选一本图书,我们包邮赠送。书籍有限,先选先得。


  • 《Python数据分析全能套装》 *2

  • 《python机器学习一本通》 *2

  • 《R语言数据分析与可视化从入门到精通》 *2


小锦鲤玩法:

  • 本次小锦鲤我们将从本公众号近15天阅读数据排名中,选出前6名伙伴,赠送红包 16.6元 元~


开奖后圈儿会给中奖者发送留言,请大家凭留言截图添加圈儿微信号:jb_quaner领取


留言要求:

  • 内容与本文核心信息相关

  • 留想要的书籍名称

  • 每人仅限精选一条留言

  • 为了大家都有机会中奖,每个小伙伴每个星期只能中一次奖哦~


截止时间: 2020 年 11 月 30 日 16:00 整


每天 17:30 不见不散!



1、Redis也能搞定时任务,你们耗子尾汁2、三面阿里竟然败在了volatile关键字上3、叫板百度云,阿里这款网盘工具,终于能用了!4、热搜第一!微信6个新表情上线,网友:我“裂开”了……

识别关注我们

了解更多精彩内容

点分享

点点赞

点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存